package algorithm;

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

/**
 * @author 江岸
 * @version V1.0
 * @ClassName: Combination
 * @description: 组合，从M个元素中取出N个元素
 * @date 2021/4/1410:24
 * @since V1.0
 */
public class Combination {

    /**
     *
     * @desc
     * @author Bob.chen
     * @param input 输入
     * @param output 临时保存组合
     * @param index 长度索引
     * @param start 开始索引
     * @param r void 返回值
     * @throws
     */
    public <E> void dfs(E[] input, E[] output, int index, int start,List<List<E>> r) {
        if (index == output.length) {
            r.add(new ArrayList(Arrays.stream(output).collect(Collectors.toList())));
        } else {
            for (int j = start; j < input.length; j++) {
                output[index] = input[j];
                dfs(input, output, index + 1, j + 1,r);
            }
        }
    }

    private static class CombinationHandler {
        private static Combination instance = new Combination();
    }

    private Combination() {
    }

    public static Combination getInstance() {
        return CombinationHandler.instance;
    }

    public static void main(String[] args) {
        String[] input = { "A", "B", "C","D"};
        int N = 2;// 组合长度
        String[] output = new String[N];
        List<List<String>> r = new ArrayList<List<String>>();
        Combination.getInstance().dfs(input, output, 0, 0,r);
        System.out.println(r);
    }
}

